"""
案列一、房子搬家具类占地面积
步骤：
1、需求分析
    房子：户型、面积
    家具：席梦思(bed)占地4平米、衣柜(chest)占地5平米、餐桌(table)占地2.5平米
2、将不同家具内放到房子里面
3、打印房子输出 房子户型、总面积、家具list num、剩余面积
PS:从最小的类开始编写，先编写类框架。(名词就是类民、对类的描述就是属性、动词就是方法)

HouseItem:
属性：name、area
方法：__init__ 、 __str__

House
属性：type、area、item_list、free_area引入这个概念很重要
方法:__init__、__str__、add_item(self,item) 这里的item就是HouseItem类
"""


class HouseItem:

    def __init__(self, name, area):
        self.name = name
        self.area = area

    def __str__(self):
        return "{0}家具的占地面积是{1:.2f}".format(self.name, self.area)


class House:

    def __init__(self, type, area):
        self.type = type
        self.area = area
        self.item_list = []
        self.free_area = area  # 初始设置就是可用面积

    def __str__(self):
        return "[{0}]房屋的总面积是{1}\n目前剩余空间{2}\n家具列表是{3}".format(self.type,self.area,self.free_area,\
                                                             self.item_list)

    def add_item(self,item):
        # 1、开始准备放家具
        print("开始准备放下{}家具".format(item.name))
        # 2、剩余面积不能＜家具面积
        if self.free_area < item.area:
            print("房子地方不够了不能摆放{}家具".format(item.name))
            return
        # 3、拜访成功打印结果
        self.free_area = self.free_area - item.area
        self.item_list.append(item.name)
        print("{}房形还余下面积{}\n目前现有家具{}".format(self.type,self.free_area,self.item_list))

ylc_house = House("三室一厅",105)

bed = HouseItem("席梦思", 5)
table = HouseItem("巨大桌子",50)
ylc_house.add_item(bed)
ylc_house.add_item(table)
print(ylc_house)

"""
案列二、许三多拿枪打设计
1、类：士兵 属性：名字、枪。方法：开火
2、类：枪 属性：model、bullet_count。方法：shoot、add_bullet_count
3、在主程序中 一个类的属性可以是一个类对象方法；属性设置时候如果没有初始值可以用 None代替
"""

class Gun:
    
    def __init__(self,model):
        self.model = model
        self.bullet_count = 0
    
    def add_bullet_count(self,count):
        self.bullet_count += count
        print("{}枪添加了{}发子弹".format(self.model,self.bullet_count))
        
    def shoot(self):
        # 1、如果子弹小于0没子弹了不能发射
        if self.bullet_count <=0:
            print("抱歉{}枪里没子弹了不能发射".format(self.model))
            return
        # 2、枪开火减去1子弹
        self.bullet_count -=1
        print("{}枪shoot... 还余下{}发子弹".format(self.model,self.bullet_count))
        
class Soldier:
    
    def __init__(self,name):
        self.name = name
        self.gun = None  #  核心代码先战士不拿枪主程序拿枪
    
    def fire(self):
        # 1、判断有没有枪
        if self.gun is None:  # 核心代码 is 身份运算符与 == 区别 提示 内存地址
            print("兄弟我没有枪啊怎么开")
            return
        # 2、开枪拉    
        print("士兵{}准备开枪了".format(self.name))
        self.gun.shoot()
        
        
AK47 = Gun("AK47")
AK47.add_bullet_count(10)
xusanduo = Soldier("徐三多")
xusanduo.gun = AK47  # 核心代码把 AK47 给xusanduo.gun属性让他拿枪
for i in range(12):
    xusanduo.fire()